home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
gnu
/
gnulib
/
libsrc98.zoo
/
fcntl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-01
|
1KB
|
68 lines
/*
* limited emulation of fcntl
*
* ++jrb bammi@cadence.com
*/
#include <fcntl.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include "lib.h"
#ifdef __STDC__
int fcntl (int f, int cmd, ...)
#else
int fcntl (f, cmd)
int f;
int cmd;
#endif
{
int handle;
va_list argp;
va_start(argp, cmd);
/* check for valid descriptor */
handle = __OPEN_INDEX(f);
if( (handle >= __NHANDLES) || (handle < 0) )
{
errno = EBADF;
return -1;
}
if(__open_stat[handle].status == FH_UNKNOWN)
isatty(f); /* try to set .status */
if((__open_stat[handle].status == FH_UNKNOWN) ||
((__open_stat[handle].status == FH_ISAFILE) && (__open_stat[handle].filename == (char *)0)) )
{
errno = EBADF;
return -1;
}
switch(cmd) {
case F_DUPFD:
/* there is no way to emulate this even reasonably under TOS, so... */
return dup(f);
case F_GETFD:
return (int) (__open_stat[handle].eclose);
case F_SETFD:
__open_stat[handle].eclose = va_arg(argp, int) & 1;
return 0;
case F_GETFL: /* fudge city */
return (int)(*((short *)(&(__open_stat[handle]))));
case F_SETFL:
*((short *)(&(__open_stat[handle]))) = va_arg(argp, int);
return 0;
default:
errno = EBADARG;
return -1;
}
}